package LeetCode1000UP;

/**
 * 检查数组是否经排序和轮转得到
 *
 * 思路: 根据题意分析
 *      轮转的数组有两种类型，第一种类型：有序数组， 轮转第0位就可以得到，相当于不轮转数组
 *                         第二种类型：有序数组的某一位经过旋转后得到的数组
 *      其余的均不符合
 *      只要判断输入的数组是否是这两类数组，如果不是，就false
 *
 */
public class L_1752 {
    public static void main(String[] args) {
        L_1752 n1 = new L_1752();
        int nums[] = {3,4,5,1,2};
//        boolean b = n1.judgeSortArray(nums);
//        System.out.println(b);
//        boolean check = n1.check(nums);
//        System.out.println(check);
//        boolean b = n1.judgeCircleArray(nums);
//        System.out.println(b);
    }

    public boolean check(int[] nums) {
        // 判断是否有序
        int n = nums.length, x = 0;
        for (int i = 1; i <n ; i++) {
            if(nums[i] < nums[i-1]){
                x = i;
                break;
            }
        }
        //证明是有序数组
        if(x == 0){
            return true;
        }
        // 判断剩下的数组是否有序并且最大值是否小于等于数组首位值， 也就是一次旋转
        for (int i = x+1; i <n ; i++) {
            if(nums[i] < nums[i-1]){
                return false;
            }
        }
        return nums[0] >= nums[n-1];
    }


    // 注释自己写的代码，报错原因是判断旋转数组出现了问题，上述是正确代码
//    public boolean check(int[] nums) {
//        if(nums.length<1){
//            return false;
//        }
//        if(nums.length<=2){
//            return true;
//        }
//        boolean flag = false;
//        flag = judgeSortArray(nums);
//        if(!flag){
//            flag = judgeCircleArray(nums);
//        }
//        return flag;
//    }
//
//    private boolean judgeSortArray(int[] nums){
//        for (int i = 1; i <nums.length ; i++) {
//            if(nums[i]<nums[i-1]){
//                return false;
//            }
//        }
//        return true;
//    }
//
//    private boolean judgeCircleArray(int[] nums){
//       // 暴力法判断
//        int start = nums[0];
//        int tmpIndex = 0;
//        // 通过暴力法找到分割的下标
//        for (int i = 1; i <nums.length ; i++) {
//            if(nums[i]<nums[i-1] && nums[i] <= start){
//                tmpIndex = i;
//                break;
//            }
//        }
//        // 余下的数组是否为有序的
//        if(tmpIndex != 0){
//            for (int i = tmpIndex+1; i <nums.length ; i++) {
//                if(nums[i]<nums[i-1]){
//                    return false;
//                }
//            }
//            // 并且末位小于首位
//            if(nums[nums.length-1] <= start){
//                return true;
//            }
//        }
//        return false;
//    }


}
